import fs from 'fs';
import path from 'path';

import config from '../../config';
import { AppModel } from '../../models/app';
import { ScriptModel } from '../../models/script';
/**
 * 验证应用ID是否存在
 * @param appIds 应用ID数组
 * @returns Promise<boolean> 是否所有应用都存在
 */
export async function validateAppIds(appIds: string[]): Promise<boolean> {
  if (appIds.length === 0) return true;

  const existingApps = await AppModel.find({ _id: { $in: appIds } }, { _id: 1 }).lean();

  return existingApps.length === appIds.length;
}

/**
 * 创建项目文件夹
 * @param projectId 项目ID
 * @returns Promise<boolean> 是否创建成功
 */
export async function createProjectDirectory(projectId: string): Promise<boolean> {
  try {
    // 验证项目数据路径是否存在
    await fs.promises.access(config.dataPath, fs.constants.F_OK);

    // 创建项目文件夹
    const projectPath = path.join(config.dataPath, projectId);
    await fs.promises.mkdir(projectPath, { recursive: true });

    console.log(`项目文件夹创建成功: ${projectPath}`);
    return true;
  } catch (error) {
    console.error('项目文件夹创建失败:', error);
    return false;
  }
}

/**
 * 删除项目文件夹
 * @param projectId 项目ID
 * @returns Promise<boolean> 是否删除成功
 */
export async function deleteProjectDirectory(projectId: string): Promise<boolean> {
  try {
    const projectPath = path.join(config.dataPath, projectId);

    // 检查文件夹是否存在
    try {
      await fs.promises.access(projectPath, fs.constants.F_OK);
    } catch {
      // 文件夹不存在，视为删除成功
      console.log(`项目文件夹不存在，跳过删除: ${projectPath}`);
      return true;
    }

    // 递归删除文件夹及其内容
    await fs.promises.rm(projectPath, { force: true, recursive: true });
    console.log(`项目文件夹删除成功: ${projectPath}`);
    return true;
  } catch (error) {
    console.error('项目文件夹删除失败:', error);
    return false;
  }
}

/**
 * 检查项目是否有关联的脚本
 * @param projectId 项目ID
 * @returns Promise<number> 关联脚本数量
 */
export async function getRelatedScriptsCount(projectId: string): Promise<number> {
  try {
    const count = await ScriptModel.countDocuments({ projectId });
    return count;
  } catch (error) {
    console.error('检查关联脚本失败:', error);
    return 0;
  }
}
